home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
tools
/
ldpcx04
/
ldpcx04s.lzh
/
LDPCX4.S
< prev
next >
Wrap
Text File
|
1997-07-23
|
12KB
|
540 lines
*****************************************************************
* 16色のPCX *
*****************************************************************
.include doscall.mac
.include iocscall.mac
.include myconst.h
.xdef _pcx4_prt
.xdef _pcx4_scroll
.xref key_chk
.xref tenkey_chk
.xref cursor_chk
.xref mouse_chk
.xref x_set
.xref y_set
.xref v_wait
.xref inf_change
.xref tate
.xref yoko
.xref crt_y
.xref x_max
.xref y_max
.xref x_pos
.xref y_pos
.xref gr_addr
.xref kflg
.xref esc_flg
.xref next_flg
.xref scroll_key
.xref s_dot4
.text
.even
*****************************************************************
* 16色表示 *
*****************************************************************
_pcx4_prt:
bsr pcx4_prt
rts
*****************************************************************
* スクロール *
*****************************************************************
_pcx4_scroll:
bsr scroll
rts
*****************************************************************
* 表示 *
*****************************************************************
pcx4_prt:
move.w x_pos(pc),d0 *表示先画像アドレス
move.w y_pos(pc),d1
swap.w d1
clr.w d1
ror.l #5,d1
add.w d0,d0
add.w d0,d1
movea.l d1,a2
adda.l #GRAM,a2
movea.l gr_addr(pc),a1 *表示もとアドレス
move.w yoko(pc),d0 *横ライン数
cmp.w #1024,d0
bcs pcx4_prt0
move.w #1024,d0
pcx4_prt0:
move.w tate(pc),d2 *縦ライン数
cmp.w #1024,d2
bcs pcx4_prt1
move.w #1024,d2
pcx4_prt1:
** move.w d2,d7
** sub.w crt_y(pc),d7 *自動スクロール用
* move.w yoko(pc),d1 *表示元データの1ライン下へのバイト数
* addq.w #1,d1
* sub.w d0,d1
* lsr.w #1,d1
* movea.w d1,a3
move.w yoko(pc),d1 *表示元データの1ライン下へのバイト数
addq.w #7,d1
and.w #$fff8,d1
sub.w d0,d1
lsr.w #1,d1
movea.w d1,a3
move.w #1024,d1 *表示先データの1ライン下までのバイト数
sub.w d0,d1
add.w d1,d1
movea.w d1,a4
cmpi.b #MC68060,MPUTYPE
bcc pcx4_prt1_
move.w d0,d1 *横ドットが16で割り切れるか
andi.w #$000f,d1
beq pcx4_16 *そう
pcx4_prt1_:
btst.l #0,d0 *横ドットが偶数か?
bne pcx4_prt4 *ちがう
subq.w #1,d2 *縦-1
lsr.w #1,d0 *横/2-1
subq.w #1,d0
pcx4_prt2: *横ドットが偶数の時
move.w d0,d1 *横ループ
pcx4_prt3
move.b (a1)+,d3
move.b d3,d4
lsr.b #4,d3 *上位4ビットを変換
move.w d3,(a2)+
move.w d4,(a2)+ *下位4ビットを変換
dbra.w d1,pcx4_prt3
adda.l a3,a1 *変換元アドレス更新
adda.l a4,a2 *変換先アドレス更新
** move.w d7,d3
** sub.w d2,d3
** bmi pcx4_prt3_
** move.w d3,$e8001a *スクロール
**pcx4_prt3_
dbra.w d2,pcx4_prt2
rts
pcx4_prt4: *横ドット数が奇数の時
subq.w #1,d2 *縦-1
lsr.w #1,d0 *横/2-1
subq.w #1,d0
pcx4_prt5
move.w d0,d1 *横ループ
pcx4_prt6
move.b (a1)+,d3
move.b d3,d4
lsr.b #4,d3 *上位4ビットを変換
move.w d3,(a2)+
move.w d4,(a2)+ *下位4ビットを変換
dbra d1,pcx4_prt6
move.b (a1)+,d3 *上位4ビットのみ変換
lsr.b #4,d3
move.w d3,(a2)+
adda.l a3,a1 *変換元アドレス更新
adda.l a4,a2 *変換先アドレス更新
** move.w d7,d3
** sub.w d2,d3
** bmi pcx4_prt6_
** move.w d3,$e8001a *スクロール
**pcx4_prt6_
dbra.w d2,pcx4_prt5
rts
pcx4_16: *横ドット数が16で割り切れる時
lea.l -16(sp),sp *ワークバッファ
subq.w #1,d2 *縦-1
lsr.w #4,d0 *横/16-1
subq.w #1,d0
pcx4_16_0:
move.w d0,d1 *横ループ
pcx4_16_1:
move.l (a1)+,d3
movep.l d3,1(sp)
ror.l #4,d3
movep.l d3,(sp)
move.l (a1)+,d3
movep.l d3,9(sp)
ror.l #4,d3
movep.l d3,8(sp)
movem.l (sp),d3-d6
movep.l d3,1(a2)
movep.l d4,9(a2)
movep.l d5,17(a2)
movep.l d6,25(a2)
lea.l 32(a2),a2
dbra.w d1,pcx4_16_1
pcx4_16_2:
suba.l a3,a1 *変換元アドレス更新
adda.l a4,a2 *変換先アドレス更新
** move.w d7,d3
** sub.w d2,d3
** bmi pcx4_16_2_
** move.w d3,$e8001a *スクロール
**pcx4_16_2_
dbra.w d2,pcx4_16_0
lea.l 16(sp),sp *戻す
rts
*****************************************************************
* スクロール制御 *
*****************************************************************
scroll:
moveq.l #0,d2 *スクロール座標初期化
moveq.l #0,d3
** move.w y_max(pc),d3
move.w d2,x_old
move.w d3,y_old
bsr down_demo
bsr right_demo
tst.b kflg *キー入力待ち
beq scroll8 *指定無し
scroll2:
bsr key_chk *キー入力チェック
tst.b esc_flg *エスケープ入力有るか
bne scroll9 *指定有り
tst.b next_flg *ネクスト入力有るか
bne scroll9 *指定有り
bsr cursor_chk *カーソルキーからの入力チェック
bsr tenkey_chk *テンキーからの入力チェック
bsr scroll_set16 *
bsr mouse_chk4 *マウスからの入力チェック
bsr lim_chk *範囲チェック
bsr go_scroll *スクロール実行
bra scroll2 *キー入力に戻る
scroll8:
bsr key_chk *ESCくらいは入力チェック
bsr mouse_chk4 *
scroll9:
rts
*****************************************************************
* 下方向へ全画面スクロールを行う *
*****************************************************************
down_demo:
tst.w y_max
beq down_demo9
move.w s_dot4(pc),-(sp)
lsr.w s_dot4
down_demo0:
bsr key_chk
bsr cursor_chk
bsr tenkey_chk
bsr mouse_chk
tst.b scroll_key
bne down_demo8
tst.b esc_flg
bne down_demo8
tst.b next_flg
bne down_demo8
bsr go_scroll
add.w s_dot4(pc),d3 *スクロール速度
cmp.w y_max(pc),d3
bls down_demo0
move.w y_max(pc),d3
bsr go_scroll
down_demo8:
move.w (sp)+,s_dot4
down_demo9:
rts
*****************************************************************
* 右方向へ全画面スクロールを行う *
*****************************************************************
right_demo:
tst.w x_max
beq right_demo9
tst.w d3
bne right_demo9
* move.w y_max(pc),d0
* cmp.w x_max(pc),d0
* bhi right_demo9
move.w s_dot4(pc),-(sp)
lsr.w s_dot4
right_demo0:
bsr key_chk
bsr cursor_chk
bsr tenkey_chk
bsr mouse_chk
tst.b scroll_key
bne right_demo8
tst.b esc_flg
bne right_demo8
tst.b next_flg
bne right_demo8
bsr go_scroll
add.w s_dot4(pc),d2 *スクロール速度
cmp.w x_max(pc),d2
bls right_demo0
move.w x_max(pc),d2
bsr go_scroll
right_demo8:
move.w (sp)+,s_dot4
right_demo9:
rts
*****************************************************************
* スクロール *
*****************************************************************
scroll_set16:
moveq.l #0,d0
move.b scroll_key(pc),d0
add.w d0,d0
add.w d0,d0
movea.l scroll_tbl(pc,d0.w),a0
jsr (a0)
rts
scroll_tbl:
.dc.l null *0000 入力無し
.dc.l left *0001 左
.dc.l up *0010 上
.dc.l left_up *0011 上左
.dc.l right *0100 右
.dc.l null *0101 右左
.dc.l right_up *0110 右上
.dc.l up *0111 右上左
.dc.l down *1000 下
.dc.l left_down *1001 下左
.dc.l null *1010 下上
.dc.l left *1011 下上左
.dc.l right_down *1100 下右
.dc.l down *1101 下右左
.dc.l right *1110 下右上
.dc.l null *1111 下右上左
.even
*****************************************************************
* 入力無し *
*****************************************************************
null:
rts
*****************************************************************
* 上へ *
*****************************************************************
up:
sub.w s_dot4(pc),d3
rts
*****************************************************************
* 右上へ *
*****************************************************************
right_up:
add.w s_dot4(pc),d2
sub.w s_dot4(pc),d3
rts
*****************************************************************
* 右へ *
*****************************************************************
right:
add.w s_dot4(pc),d2
rts
*****************************************************************
* 右下へ *
*****************************************************************
right_down:
add.w s_dot4(pc),d2
add.w s_dot4(pc),d3
rts
*****************************************************************
* 下へ *
*****************************************************************
down:
add.w s_dot4(pc),d3
rts
*****************************************************************
* 左下へ *
*****************************************************************
left_down:
sub.w s_dot4(pc),d2
add.w s_dot4(pc),d3
rts
*****************************************************************
* 左へ *
*****************************************************************
left:
sub.w s_dot4(pc),d2
rts
*****************************************************************
* 左上へ *
*****************************************************************
left_up:
sub.w s_dot4(pc),d2
sub.w s_dot4(pc),d3
rts
*****************************************************************
* マウスからの入力をチェックする *
*****************************************************************
mouse_chk4:
IOCS _MS_GETDT *マウスからのデータをGET
cmpi.b #$ff,d0 *右ボタンが押されたか
beq mouse_right *押された
andi.w #$ff00,d0 *左ボタンが押されたか
bne mouse_left *押された
swap d0
move.w d0,d1
andi.w #$ff00,d0
andi.w #$00ff,d1
ror.l #8,d0
ms_x_chk: *X方向の移動量を調べる
tst.b d0
beq ms_y_chk
blt ms_xm *移動量がマイナスの時飛ぶ
cmp.b #2,d0
bls ms_x_chk2
subq.b #1,d0
add.b d0,d0 *移動量を二倍にする
ms_x_chk2:
add.w d0,d2 *移動量を加算する
bra ms_y_chk
ms_xm: *移動量がマイナスのとき
neg.b d0 *移動量をプラスにする
cmp.b #2,d0
bls ms_xm2
subq.b #1,d0
add.b d0,d0 *移動量を二倍にする
ms_xm2:
sub.w d0,d2 *移動量を減算する
ms_y_chk: *Y方向の移動量を調べる
tst.b d1
beq mouse_chk_end
blt ms_ym *移動量がマイナスの時飛ぶ
cmp.b #2,d1
bls ms_y_chk2
subq.b #1,d1
add.b d1,d1 *移動量を二倍にする
ms_y_chk2:
add.w d1,d3 *移動量を加算する
bra mouse_chk_end
ms_ym: *移動量がマイナスのとき
neg.b d1 *移動量をプラスにする
cmp.b #2,d1
bls ms_ym2
subq.b #1,d1
add.b d1,d1 *移動量を二倍にする
ms_ym2:
sub.w d1,d3 *移動量を減算する
mouse_chk_end:
rts
mouse_right:
andi.w #$ff00,d0 *更に左ボタンが押されたか
bne mouse_right1 *押された
bsr inf_change *情報表示の変更
mouse_right0:
IOCS _MS_GETDT *マウスからのデータをGET
cmpi.b #$ff,d0 *右ボタンが押されたか
bne mouse_right2 *押されいない
andi.w #$ff00,d0 *左ボタンが押されたか
bne mouse_right1 *押された
bra mouse_right0
mouse_right1:
st esc_flg *ESCスイッチON
mouse_right2:
rts
mouse_left:
st next_flg *NEXTスイッチON
rts
*****************************************************************
* 座標の範囲チェックを行う *
*****************************************************************
lim_chk: *X座標のチェックを行う
tst.w d2
bge lim_chk2
clr.w d2
lim_chk2:
cmp.w x_max(pc),d2
bls lim_chk3
move.w x_max(pc),d2
lim_chk3: *Y座標のチェックを行う
tst.w d3
bge lim_chk4
clr.w d3
lim_chk4:
cmp.w y_max(pc),d3
bls lim_chk5
move.w y_max(pc),d3
lim_chk5:
rts
*****************************************************************
* グラフィック画面のスクロールを行う *
*****************************************************************
go_scroll:
bsr v_wait
bsr x_set
bsr y_set
rts
*****************************************************************
* ワークエリア *
*****************************************************************
.bss
.even
gram_x .ds.w 1 *表示する座標(GRAM)
gram_y .ds.w 1
bmp_x .ds.w 1 *表示する座標(BMP)
bmp_y .ds.w 1
bmp_xd .ds.w 1 *表示するドット数
bmp_yd .ds.w 1
line_byte:
.ds.w 1 *1ラインのバイト数
x_old:
.ds.w 1 *前回のX座標
y_old:
.ds.w 1 *前回のY座標
.even